目次
ブロックチェーンとHyperledger Fabric
昨今しばしば話題に上がっているブロックチェーン。今回はそのブロックチェーンの中のフレームワークの1つである Hyperledger Fabricのサンプルプロジェクトのfabcarを立ち上げる方法について紹介します。
ブロックチェーンとは
ブロックチェーンは仮想通貨ビットコインの基幹技術として発明された概念です。インターネットなどオープンなネットワーク上で、高い信頼性が求められる金融取引や重要データのやりとりなどを可能にする分散型台帳技術の中心となるものです。
ブロックチェーンのメリットは以下の3つです。
1. 改ざんが困難
特定のブロックを改ざんしたとしても、結局全てのブロックを芋づる式に作り直す必要があり、改ざんは実質不可能であること。
2. 頑強な破壊体制
取引記録を分散管理しているため、取引記録を破壊することは実質不可能であること。
3. 信頼コストが低い
次章で説明するパブリック型ブロックチェーンでは中央機関が無いため、「信頼する」必要がないこと。
ブロックチェーンの種類
ブロックチェーンは種類と用途に応じてパブリック型、コンソーシアム型、プライベート型の3種類に分けられます。各種類のブロックチェーンの概要は以下の通りです。
| パブリック型 | コンソーシアム型 | プライベート型 | |
| 概要 |
誰でもネットワークに 参加可能 |
許可された複数の企業が 参加可能 |
許可された複数の組織が 参加可能 |
| 特徴 | 取引後にノード間のデータ同期を行う | 取引前にノード間のデータ同期を行う | |
| 管理主体 | 管理者なし | 管理者あり(各企業) | 管理者あり(各組織) |
| ノード所持者 | 誰でも保持可能 | 許可された参加者のみ保持可能 | |
| コンセンサス | 消費電力が大きい | 高速、消費電力が小さい | |
| データの記録完了保障 | なし | あり | |
Hyperledger Fabric
Hyperledgerは、非営利組織「The Linux Foundation」の協力プロジェクトのひとつとして、2016年に発足したプロジェクトです。エンタープライズ向けの許可型ブロックチェーン(コンソーシアム型、プライベート型)を少ない工数で構築するためのフレームワークとツールセット、ライブラリが提供されており、260を超える組織が参画しています。
Hyperledgerは単一のブロックチェーンではなく、複数のフレームワークやツールなどから構成されています。複数あるHyperledgerプロジェクトの内の1つであるHyperledger Fabricは、IBMが主体となって開発していて最も普及しています。今回はこのHyperledger Fabricのサンプルプロジェクトであるfabcarを試します。
Hyperledger Fabricのfabcarを立ち上げる方法
それでは実際にHyperledger Fabricのサンプルプロジェクトであるfabcarを立ち上げます。fabcarは自動車の色などの情報をブロックチェーンの台帳上から参照したり、台帳に新規登録できるようなプロジェクトです。
作成する環境
今回は以下の環境を立ち上げます。
- AWS EC2インスタンス(OS:Amazon Linux 2、※インスタンスの種類:t3.small)
- Hyperledger Fabric ver2.2.0のサンプルプロジェクトであるfabcar
※t3.small以上のサイズでないとメモリが足りずにブロックチェーンネットワークを立ち上げることができません。
環境構築
EC2インスタンスの立ち上げ
AWS EC2インスタンスの立ち上げ方法については省略します。作成したEC2インスタンスにお手元のPCからSSH接続してください。
パッケージ管理ツールのアップデート
作成したEC2インスタンスにSSH接続できたら以下のコマンドでパッケージ管理ツールをアップデートします。
|
1 |
$ sudo yum -y update |
サーバーを立ち上げたときのおまじないのようなものですね。
Dockerのインストール
次にコンテナ型の仮想環境を作成、実行、配布するためのプラットフォームであるDockerのインストールを行います。
|
1 |
$ sudo yum install -y docker |
Dockerグループに一般ユーザー(ec2-user)を加えて、一般ユーザーからdockerコマンドを使用できるようにします。
|
1 |
$ sudo usermod -a -G docker ec2-user |
Dockerグループに一般ユーザーが追加できたか確認します。以下のように表示されれば追加ができています。
|
1 2 |
$ cat /etc/group | grep docker docker:x:993:ec2-user |
Docker Composeのインストール
Dockerをインストールしたら、複数のコンテナで構成されるアプリケーションについてDockerイメージのビルドや各コンテナの起動・停止などをより簡単に行えるようにするツールであるDocker Composeをインストールします。こちらから、適当なバージョンのDocker Composeをインストールしてください。
ちなみに私は2020/7/13現在の最新版であるバージョン1.26.2をインストールしました。以下の1.26.2はインストールしたいバージョンによって書き換えてください
|
1 |
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose |
このままではdocker-composeコマンドを実行できない状態なので、実行権限を付与します。
|
1 |
$ sudo chmod +x /usr/local/bin/docker-compose |
Dockerの起動
Dockerの準備が整ったのでDockerを起動します。
|
1 |
$ sudo service docker start |
一度ログアウト後再度ログインし、Dockerが起動したことを確認してください。起動していれば以下のように表示されます。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$ docker info Client: Debug Mode: false Server: Containers: 0 Running: 0 Paused: 0 Stopped: 0 Images: 16 Server Version: 19.03.6-ce ・ ・ ・ |
Dockerの情報が表示されない場合は、ログアウトがうまくできていない可能性があります。下記のコマンドでec2-userを強制的にログアウトさせてから上記の確認コマンドを実行してください。
|
1 |
$ killall -u ec2-user |
Node.js、Goのバージョン
今回はHyperledger Fabric v2.2.0を使用しますが他のバージョンを使用したい場合は、対応するバージョンのNode.js、Goをインストールするようにしてください。Hyperledger Fabricの詳細なバージョン情報はこちらです。また、こちらのページでHyperledger Fabric最新版に必要なNode.js、Goのバージョンを調べられます。
Node.jsのインストール
まずはNode.jsのバージョン管理ツールであるnvmをインストールします。今回は2020/8/19日現在最新版であるv0.35.3をインストールします。nvmのバージョン情報についてはこちらで調べられます。
|
1 |
$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.35.3/install.sh | bash |
一度ログアウトし、再度ログインしてください。nvmでダウンロードできるNode.jsのバージョンを確認します。
|
1 |
$ nvm ls-remote |
こちらのページでHyperledger Fabricに必要なNode.jsのバージョンを調べて、使用したいHyperledger Fabricのバージョンに対応するNode.jsをダウンロードしてください。今回はv12.18.3をダウンロードします。
|
1 |
$ nvm install v12.18.3 |
gccのインストール
Hyperledger FabricをNode.jsで操作するために必要なFabric SDK for Node.jsのインストールに使用するgccをインストールします。
|
1 |
$ sudo yum install -y gcc-c++ |
Goのインストール
こちらのページでHyperledger Fabricに必要なGoのバージョンを調べて、使用したいHyperledger Fabricのバージョンに対応するGoをダウンロードしてください。Go自体のバージョンについてはこちらのページで確認できます。今回は1.14.7を使用します。
|
1 2 3 |
$ wget https://dl.google.com/go/go1.14.7.linux-amd64.tar.gz $ sudo tar -C /usr/local -xzf go1.14.7.linux-amd64.tar.gz $ export PATH=$PATH:/usr/local/go/bin |
バージョンを確認します。
|
1 |
$ go version |
Gitのインストール
プログラムなどのバージョン管理システムであるGitをインストールします。Hyperledger Fabricのサンプルプロジェクトをダウンロードするのに使用します。
|
1 |
$ sudo yum install -y git |
サンプルプロジェクトのダウンロード
Hyperledger Fabricのサンプルプロジェクトをインストールします。今回は2020/7/13現在最新版であるv2.2.0をインストールします。2.2.0の部分はインストールしたいバージョンに合わせて書き換えてください。
|
1 |
$ curl -sSL http://bit.ly/2ysbOFE | bash -s 2.2.0 |
これでサンプルプロジェクトを実行する環境が整いました。
サンプルプログラムの実行
サンプルを実行する環境が整ったので実際に実行していきます。
ブロックチェーンネットワークの起動
ブロックチェーンネットワークを起動します。Hyperledger Fabricではチェーンコードという取引の内容を記述するコードを、Go、Node.jsで書くことができます。今回はNode.jsで書かれたチェーンコードを使用します。
|
1 2 |
$ cd fabric-samples/fabcar/ $ ./startFabric.sh javascript |
起動コンテナを確認します。以下のように表示されれば正常です。
|
1 2 3 4 5 6 7 8 9 10 11 |
$ docker ps --format "{{.Names}}" dev-peer0.org1.example.com-fabcar_1-... dev-peer0.org2.example.com-fabcar_1-... peer0.org2.example.com peer0.org1.example.com orderer.example.com couchdb0 couchdb1 ca_orderer ca_org1 ca_org2 |
Fabric SDK for Node.jsのインストール
Hyperledger FabricをNode.jsで操作するために必要なFabric SDK for Node.jsをインストールします。
|
1 2 3 |
$ cd javascript/ $ npm install $ npm rebuild |
ユーザーの登録
Fabric SDKでチェーンコードを操作するにはユーザーが必要です。そのユーザーを登録するために必要な管理者の登録を行います。
|
1 |
$ node enrollAdmin.js |
ユーザーを登録します。
|
1 |
$ node registerUser.js |
walletフォルダ内に管理者とユーザーが登録されたことを確認します。
|
1 2 |
$ ls wallet admin.id appUser.id |
これで実際にfabcarの※チェーンコードを動作させる準備が整いました。
※チェーンコードはHyperledger Fabric ネットワーク上にデプロイされ、トランザクションを処理するプログラムコードです。
Hyperledger Fabric では、契約条件の締結や履行がプログラムによって自動で実行される仕組みをチェーンコードとして実現しています。
チェーンコード実行
それでは実際にチェーンコードを実行します。
まずは、台帳をの中身を見てみます。CAR0~CAR9までの計9台の自動車情報が登録されていることを確認できます。
|
1 2 3 |
$ node query.js Wallet path: /home/ec2-user/fabric-samples/fabcar/javascript/wallet Transaction has been evaluated, result is: [{"Key":"CAR0","Record":{"color":"blue","docType":"car","make":"Toyota","model":"Prius","owner":"Tomoko"}},{"Key":"CAR1","Record":{"color":"red","docType":"car","make":"Ford","model":"Mustang","owner":"Brad"}},{"Key":"CAR2","Record":{"color":"green","docType":"car","make":"Hyundai","model":"Tucson","owner":"Jin Soo"}},{"Key":"CAR3","Record":{"color":"yellow","docType":"car","make":"Volkswagen","model":"Passat","owner":"Max"}},{"Key":"CAR4","Record":{"color":"black","docType":"car","make":"Tesla","model":"S","owner":"Adriana"}},{"Key":"CAR5","Record":{"color":"purple","docType":"car","make":"Peugeot","model":"205","owner":"Michel"}},{"Key":"CAR6","Record":{"color":"white","docType":"car","make":"Chery","model":"S22L","owner":"Aarav"}},{"Key":"CAR7","Record":{"color":"violet","docType":"car","make":"Fiat","model":"Punto","owner":"Pari"}},{"Key":"CAR8","Record":{"color":"indigo","docType":"car","make":"Tata","model":"Nano","owner":"Valeria"}},{"Key":"CAR9","Record":{"color":"brown","docType":"car","make":"Holden","model":"Barina","owner":"Shotaro"}}] |
次に、台帳に新しくCAR12の自動車情報を追加します。
invokeの内容については同ディレクトリ内のinvoke.jsに書かれているので、詳しく知りたい方はそちらを参照してください。
|
1 |
$ node invoke.js |
再度台帳を参照します。少しわかりづらいかもしれませんが、CAR12が追加されていることが確認できます。
|
1 2 3 |
$ node query.js Wallet path: /home/ec2-user/fabric-samples/fabcar/javascript/wallet Transaction has been evaluated, result is: [{"Key":"CAR0","Record":{"color":"blue","docType":"car","make":"Toyota","model":"Prius","owner":"Tomoko"}},{"Key":"CAR1","Record":{"color":"red","docType":"car","make":"Ford","model":"Mustang","owner":"Brad"}},{"Key":"CAR12","Record":{"color":"Black","docType":"car","make":"Honda","model":"Accord","owner":"Tom"}},{"Key":"CAR2","Record":{"color":"green","docType":"car","make":"Hyundai","model":"Tucson","owner":"Jin Soo"}},{"Key":"CAR3","Record":{"color":"yellow","docType":"car","make":"Volkswagen","model":"Passat","owner":"Max"}},{"Key":"CAR4","Record":{"color":"black","docType":"car","make":"Tesla","model":"S","owner":"Adriana"}},{"Key":"CAR5","Record":{"color":"purple","docType":"car","make":"Peugeot","model":"205","owner":"Michel"}},{"Key":"CAR6","Record":{"color":"white","docType":"car","make":"Chery","model":"S22L","owner":"Aarav"}},{"Key":"CAR7","Record":{"color":"violet","docType":"car","make":"Fiat","model":"Punto","owner":"Pari"}},{"Key":"CAR8","Record":{"color":"indigo","docType":"car","make":"Tata","model":"Nano","owner":"Valeria"}},{"Key":"CAR9","Record":{"color":"brown","docType":"car","make":"Holden","model":"Barina","owner":"Shotaro"}}] |
ブロックチェーンネットワークの停止
最後にブロックチェーンネットワークを停止します。
|
1 2 |
$ cd ../ $ ./networkDown.sh |
最後に
今回はHyperledger Fabricのサンプルプログラムの環境構築について説明しました。新しいバージョンの日本語のHyperledger Fabricの記事が少なく、私自身がかなり苦労したので、この記事がHyperledger Fabricを学習しようとしている方の助けになればと思います。
執筆者プロフィール

- tdi AI&データマネジメント推進部
- tdiロボコンチーム"tadaima G4"の一員として、ITAロボコン優勝、ETロボコンCS大会3位、見るべきモデル大賞に貢献。AI勉強中。



